/*
 * FileName: AtomicReferenceDemo.java
 * Author:   zzw
 * Date:     2018年05月17日
 * Description:
 */
package com.zzw.thread;

import java.util.concurrent.atomic.AtomicReference;

/**
 * 〈〉<br>
 * 〈〉
 *
 * @author zzw
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本]（可选）
 */
public class AtomicReferenceDemo {

    private static AtomicReference<Integer> money = new AtomicReference<>();

    public static void main(String[] args) {
        test();
    }

    public static void test(){
        money.set(19);

        for (int i = 0;i < 3;i++){
            new Thread(){
                @Override
                public void run() {
                    while (true){
                        while(true){
                            Integer m = money.get();
                            if(m < 20){
                                if (money.compareAndSet(m,m + 20)){
                                    System.out.println("余额小于20元，充值成功，余额:" + money.get() + "元");
                                    break;
                                }
                            }
                            else {
                                break;
                            }
                        }
                    }
                }
            }.start();
        }

        new Thread(){
            @Override
            public void run() {
                for (int i = 0;i < 100;i++){
                    while (true){
                        Integer m = money.get();
                        if(m > 10){
                            System.out.println("大于10元");
                            if(money.compareAndSet(m,m - 10)){
                                System.out.println("成功消费10元，余额:" + money.get());
                                break;
                            }
                        }
                        else {
                            System.out.println("没有足够余额");
                            break;
                        }
                    }
                }
                try {
                    Thread.sleep(100);
                }
                catch (Exception e){

                }
            }
        }.start();
    }
}
